home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / pibt32s3.arc / RECEIVEA.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-10-27  |  7.6 KB  |  233 lines

  1. (*----------------------------------------------------------------------*)
  2. (*                Receive_Ascii_File --- Download ASCII file            *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. OVERLAY PROCEDURE Receive_Ascii_File;
  6.  
  7. (*----------------------------------------------------------------------*)
  8. (*                                                                      *)
  9. (*     Procedure:  Receive_Ascii_File                                   *)
  10. (*                                                                      *)
  11. (*     Purpose:    Downloads ASCII file to PC                           *)
  12. (*                                                                      *)
  13. (*     Calling Sequence:                                                *)
  14. (*                                                                      *)
  15. (*        Receive_Ascii_File;                                           *)
  16. (*                                                                      *)
  17. (*     Calls:   KeyPressed                                              *)
  18. (*              Async_Send                                              *)
  19. (*              Async_Receive                                           *)
  20. (*              Async_Percentage_Used                                   *)
  21. (*                                                                      *)
  22. (*     Remarks:                                                         *)
  23. (*                                                                      *)
  24. (*        XON/XOFF is assumed to be supported by the host.              *)
  25. (*                                                                      *)
  26. (*----------------------------------------------------------------------*)
  27.  
  28. VAR
  29.    Ch         : CHAR;
  30.    Fin        : BOOLEAN;
  31.    XOFF_Sent  : BOOLEAN             (* TRUE if XOFF sent to host *);
  32.    X          : INTEGER;
  33.    Y          : INTEGER;
  34.    N_Xoff     : INTEGER;
  35.    Line_Count : REAL;
  36.    Byte_Count : REAL;
  37.  
  38. (*----------------------------------------------------------------------*)
  39. (*      Activate_Status_Window --- switch to status display window      *)
  40. (*----------------------------------------------------------------------*)
  41.  
  42. PROCEDURE Activate_Status_Window;
  43.  
  44. BEGIN (* Activate_Status_Window *)
  45.  
  46.    IF Ascii_Show_Text THEN
  47.       BEGIN
  48.          X := WhereX;
  49.          Y := WhereY;
  50.          Window( 16, 5, 77, 10 );
  51.       END;
  52.  
  53. END   (* Activate_Status_Window *);
  54.  
  55. (*----------------------------------------------------------------------*)
  56. (*         Activate_Text_Window --- switch to text display window       *)
  57. (*----------------------------------------------------------------------*)
  58.  
  59. PROCEDURE Activate_Text_Window;
  60.  
  61. BEGIN (* Activate_Text_Window *)
  62.  
  63.    IF Ascii_Show_Text THEN
  64.       BEGIN
  65.          Window( 1, 14, 80, 25 );
  66.          GoToXY( X , Y );
  67.       END;
  68.  
  69. END   (* Activate_Text_Window *);
  70.  
  71. (*----------------------------------------------------------------------*)
  72. (*  Update_Ascii_Receive_Display --- Update display of Xmodem reception *)
  73. (*----------------------------------------------------------------------*)
  74.  
  75. PROCEDURE  Update_Ascii_Receive_Display;
  76.  
  77. BEGIN (* Update_Ascii_Receive_Display *)
  78.  
  79.    Activate_Status_Window;
  80.  
  81.    GoToXY( 17 , 1 );
  82.    WRITE( Line_Count:8:0 );
  83.    GoToXY( 17 , 2 );
  84.    WRITE( Byte_Count:8:0 );
  85.  
  86.    Activate_Text_Window;
  87.  
  88. END   (* Update_Ascii_Receive_Display *);
  89.  
  90. (*----------------------------------------------------------------------*)
  91.  
  92. BEGIN (* Receive_Ascii_File *)
  93.  
  94.    Fin        := FALSE;
  95.    XOFF_Sent  := FALSE;
  96.    N_Xoff     := 0;
  97.    Line_Count := 0;
  98.    Byte_Count := 0;
  99.    X          := 1;
  100.    Y          := 1;
  101.                                    (* Save current screen contents     *)
  102.    Save_Screen( Saved_Screen );
  103.                                    (* Open display window for received *)
  104.                                    (* text lines.                      *)
  105.    IF Ascii_Show_Text THEN
  106.       BEGIN
  107.  
  108.          TextColor( Menu_Text_Color );
  109.  
  110.          Window( 1, 1, 80, 25 );
  111.          GoToXY( 1 , 13 );
  112.  
  113.          FOR I := 1 TO 25 DO WRITE('=');
  114.          WRITE('Received text displayed below');
  115.          FOR I := 1 TO 25 DO WRITE('=');
  116.  
  117.       END;
  118.                                    (* Open display window for transfer  *)
  119.  
  120.    Draw_Menu_Frame( 15, 4, 78, 11, Menu_Frame_Color,
  121.                     Menu_Text_Color,
  122.                     'Receive file ' + FileName + ' using ASCII' );
  123.  
  124.                                    (* Headings for status information *)
  125.    Window( 16, 5, 77, 10 );
  126.    GoToXY( 1 , 1 );
  127.    WRITELN(' Lines received: ');
  128.    WRITELN(' Bytes received: ');
  129.    WRITELN(' ');
  130.                                    (* Open reception file *)
  131.    ASSIGN( Afile, FileName );
  132.    REWRITE( AFile );
  133.  
  134.    IF Ascii_Show_Text THEN
  135.       BEGIN
  136.          Window( 1, 14, 80, 25 );
  137.          GoToXY( 1 , 1 );
  138.          Clear_Window;
  139.       END;
  140.  
  141.    REPEAT
  142.  
  143.       IF Async_Percentage_Used > 0.75 THEN
  144.          BEGIN  (* Buffer too full -- send XOFF if we already haven't *)
  145.             IF ( NOT XOFF_Sent ) THEN
  146.                BEGIN
  147.                   Async_Send( CHR( XOFF ) );
  148.                   XOFF_Sent := TRUE;
  149.                   Activate_Status_Window;
  150.                   GoToXY( 1 , 4 );
  151.                   WRITE(' XOFF sent, percentage = ',Async_Percentage_Used:5:2 );
  152.                   ClrEol;
  153.                   N_Xoff := N_Xoff + 1;
  154.                   Activate_Text_Window;
  155.                END
  156.          END    (* Buffer too full *)
  157.       ELSE IF Async_Percentage_Used < 0.25 THEN
  158.          BEGIN  (* Buffer reasonably empty -- send XON if needed *)
  159.             IF XOFF_Sent THEN
  160.                BEGIN
  161.                   Async_Send( CHR( XON ) );
  162.                   XOFF_Sent := FALSE;
  163.                   Activate_Status_Window;
  164.                   GoToXY( 1 , 4 );
  165.                   WRITE(' XON  sent, percentage = ',Async_Percentage_Used:5:2 );
  166.                   ClrEol;
  167.                   Activate_Text_Window;
  168.                END;
  169.          END;
  170.                                    (* Check for Alt_R -- ends transfer *)
  171.       IF KeyPressed THEN
  172.          BEGIN
  173.             READ( Kbd , Ch );
  174.             IF ( Ch = CHR( ESC ) ) AND KeyPressed THEN
  175.                BEGIN
  176.                   READ( Kbd , Ch );
  177.                   IF ORD( Ch ) = Alt_R THEN
  178.                      Fin := TRUE;
  179.                END
  180.             ELSE
  181.                Async_Send( Ch );
  182.          END;
  183.  
  184.       IF Async_Receive( Ch ) THEN
  185.          BEGIN
  186.  
  187.             WRITE( AFile , Ch );
  188.  
  189.             IF Ascii_Show_Text THEN
  190.                WRITE( Ch );
  191.  
  192.             Byte_Count := Byte_Count + 1;
  193.  
  194.             IF ( Ch = CHR( CR ) ) THEN
  195.                BEGIN
  196.                   Line_Count := Line_Count + 1;
  197.                   Update_Ascii_Receive_Display;
  198.                END
  199.             ELSE IF Ascii_Use_CtrlZ THEN
  200.                IF ( Ch = ^Z ) THEN
  201.                   Fin := TRUE;
  202.  
  203.          END;
  204.  
  205.       Fin := Fin OR Async_Carrier_Drop;
  206.  
  207.    UNTIL ( Fin );
  208.  
  209.    Activate_Status_Window;
  210.  
  211.    IF Async_Carrier_Drop THEN
  212.       BEGIN
  213.          GoToXY( 1 , 4 );
  214.          Writelne('Carrier dropped, transfer stopped.' , TRUE );
  215.       END
  216.    ELSE
  217.       BEGIN
  218.          GoToXY( 1 , 4 );
  219.          Writelne('Finished receiving ASCII file ' + FileName , TRUE );
  220.          GoToXY( 1 , 5 );
  221.          WRITELN('Number of XOFFs sent: ',N_Xoff);
  222.       END;
  223.  
  224.    DELAY( Two_Second_Delay );
  225.  
  226.    CLOSE( AFile );
  227.                                    (* Remove this window            *)
  228.    Restore_Screen( Saved_Screen );
  229.  
  230.    Reset_Global_Colors;
  231.  
  232. END   (* Receive_Ascii_File *);
  233.